package com.system.cacheCenterBackend.controller.redisDataController;

import com.system.cacheCenterBackend.controller.hotKeyController.HotKeyController;
import com.system.cacheCenterBackend.service.ZSetCacheService;
import com.system.cacheClient.common.CacheR;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.Set;

/**
 * ZSet缓存控制器
 * 提供ZSet类型的RESTful API接口
 */
@RestController
@RequestMapping("/cache/zset")
@RequiredArgsConstructor
public class ZSetCacheController {

    private final ZSetCacheService zSetCacheService;

    /**
     * 向ZSet添加元素
     *
     * @param key   ZSet键
     * @param value 元素值
     * @param score 分数
     * @return 统一返回结果
     */
    @PostMapping("/{key}")
    public CacheR<Boolean> add(@PathVariable String key, @RequestParam String value, @RequestParam double score) {
        try {
            boolean result = zSetCacheService.zsetAdd(key, value, score);
            if (result) {
                // 添加键到热点数据控制器中
                HotKeyController.addKey("zset", key);
                return CacheR.success(true, "添加ZSet元素成功");
            } else {
                return CacheR.fail("添加ZSet元素失败");
            }
        } catch (Exception e) {
            return CacheR.fail("添加ZSet元素异常: " + e.getMessage());
        }
    }

    /**
     * 获取ZSet缓存值
     *
     * @param key ZSet键
     * @return 统一返回结果
     */
    @GetMapping("/{key}")
    public CacheR<Set<String>> get(@PathVariable String key) {
        try {
            Set<String> value = zSetCacheService.zsetRange(key, 0, -1);
            if (value != null) {
                return CacheR.success(value, "获取ZSet缓存成功");
            } else {
                return CacheR.fail(404, "ZSet缓存不存在");
            }
        } catch (Exception e) {
            return CacheR.fail("获取ZSet缓存异常: " + e.getMessage());
        }
    }

    /**
     * 删除ZSet缓存值
     *
     * @param key ZSet键
     * @return 统一返回结果
     */
    @DeleteMapping("/{key}/{value}")
    public CacheR<Boolean> delete(@PathVariable String key, @PathVariable String value) {
        try {
            if (zSetCacheService.zsetRemove(key,  value) != 0) {
                // 从热点数据控制器中移除键
                HotKeyController.removeKey("zset", key);
                return CacheR.success(true, "删除ZSet缓存成功");
            } else {
                return CacheR.fail("删除ZSet缓存失败");
            }
        } catch (Exception e) {
            return CacheR.fail("删除ZSet缓存异常: " + e.getMessage());
        }
    }

    /**
     * 设置ZSet缓存过期时间
     *
     * @param key     ZSet键
     * @param timeout 过期时间（秒）
     * @return 统一返回结果
     */
//    @PostMapping("/{key}/expire")
//    public CacheR<Boolean> expire(@PathVariable String key, @RequestParam long timeout) {
//        try {
//            boolean result = zSetCacheService.expire(key, timeout);
//            if (result) {
//                return CacheR.success(true, "设置过期时间成功");
//            } else {
//                return CacheR.fail("设置过期时间失败");
//            }
//        } catch (Exception e) {
//            return CacheR.fail("设置过期时间异常: " + e.getMessage());
//        }
//    }
}